package com.example.business.service.impl;

import com.example.business.feign.OrderFeignClient;
import com.example.business.feign.StorageFeignClient;
import com.example.business.service.BusinessService;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BusinessServiceImpl implements BusinessService {

    /**
     * 库存FeignClient
     */
    @Autowired
    StorageFeignClient storageFeignClient;

    /**
     * 订单FeignClient
     */
    @Autowired
    OrderFeignClient orderFeignClient;

    /**
     * 购买
     * 开启全局事务时，TC 会记录当前时间 start_time 和 timeout（单位：毫秒）。
     * TC 会定期扫描事务状态，如果 current_time - start_time > timeout，事务还未完成，就会触发 自动回滚。
     * 所以，如果你的业务逻辑运行时间可能超过默认值（60秒），你必须 手动调高 timeoutMills，否则事务会在后台被 Seata 判定为超时而回滚。
     *
     * @param userId        用户ID
     * @param commodityCode 商品编码
     * @param orderCount    订单数量
     * @GlobalTransactional(timeoutMills = ...)    Java 方法上  指定该事务的精确超时（推荐）
     */
    @GlobalTransactional(timeoutMills = 300000) // 全局事务注解 // 开启一个全局事务，并确保调用链中所有微服务的本地事务统一提交或回滚。
    @Override
    public void purchase(String userId, String commodityCode, int orderCount) {
        //1. 扣减库存
        storageFeignClient.deduct(commodityCode, orderCount);

        //2. 创建订单
        orderFeignClient.create(userId, commodityCode, orderCount);
    }

}
